#pragma once

#include "Tool.hpp"
#include <regex>
#include <unordered_map>

//请求报文中，一行的最大长度（默认为8kb）
static const uint32_t RequestLineMaxLength=8192;

// 这个模块是HTTP请求数据模块，用于保存HTTP请求数据被解析后的各项请求元素信息
class HttpRequest
{
public:
    // 请求方法
    string _method;
    // 请求资源路径
    string _uri;
    // 查询字符串
    unordered_map<string, string> _params;
    // 协议版本
    string _version;
    // 请求报头
    unordered_map<string, string> _headers;
    // 请求正文
    string _body;
    
public:
    // 插入请求报头(如果存在key就更新,如果不存在key,就直接插入)
    void InsertHead(const string &key, const string &val)
    {
        // 如果存在key就更新
        // 如果不存在key,就直接插入
        _headers[key] = val;
    }
    // 判断指定请求报头是否存在
    bool HasHead(const string &key)
    {
        // 如果不存在
        if (_headers.find(key) == _headers.end())
        {
            return false;
        }
        else // 如果存在
        {
            return true;
        }
    }
    // 获取指定请求报头的value
    string GetHead(const string &key)
    {
        if (HasHead(key))
        {
            return _headers[key];
        }
        else
        {
            LOG(LogLevel::DEBUG) << "访问的请求报头: " << key << "不存在";
            return "";
        }
    }
    // 插入查询字符串(如果存在key就更新,如果不存在key,就直接插入)
    void InsertParam(const string &key, const string &val)
    {
        // 如果存在key就更新
        // 如果不存在key,就直接插入
        _params[key]=val;
    }
    //判断指定查询字符串是否存在
    bool HasParam(const string &key)
    {
        // 如果不存在
        if (_params.find(key) == _params.end())
        {
            return false;
        }
        else // 如果存在
        {
            return true;
        }
    }
    //获取指定查询字符串的values
    string GetParam(const string &key)
    {
        if (HasParam(key))
        {
            return _params[key];
        }
        else
        {
            LOG(LogLevel::DEBUG) << "访问的查询字符串: " << key << "不存在";
            return "";
        }
    }
    //请求正文长度
    uint64_t ContenLength()
    {
        //如果存在该头部字段
        if(HasHead("Content-Length"))
        {
            return stoul(GetHead("Content-Length"));
        }
        else
        {
            //如果不存在，就返回0
            return 0;
        }
    }
    //是否为短连接
    bool IsShortConnections()
    {
        //如果没有Connection头部字段或者有该字段但是val为close
        //那么就是短连接
        if(HasHead("Connection")==false)
        {
            return true;
        }
        else if(GetHead("Connection")=="close")
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    //重置当前HttpRequest对象 
    void ReSet()
    {
        _method.clear();
        _uri.clear();
        _params.clear();
        _version.clear();
        _headers.clear();
        _body.clear();
    }
};